package com.fortune.service.impl;

import java.util.List;

import com.fortune.vo.dStoreTrans.*;
import com.fortune.vo.mStoreTrans.MStoreTransInfoDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.fortune.common.paging.PagingData;
import com.fortune.dao.DStoreTransDao;
import com.fortune.dao.DproductStockDetailInfoDao;
import com.fortune.dto.in.dStoreTrans.DStoreTransAListDto;
import com.fortune.dto.in.dStoreTrans.DStoreTransAddDetailDto;
import com.fortune.dto.in.dStoreTrans.DStoreTransAddDto;
import com.fortune.dto.in.dStoreTrans.DStoreTransEditDto;
import com.fortune.entity.DUserInfo;
import com.fortune.service.DStoreTransService;
import com.fortune.util.UUIDUtil;

@Service
public class DStoreTransServiceImpl implements DStoreTransService {
	
	@Autowired
	private DStoreTransDao dStoreTransDao;
	@Autowired
	private DproductStockDetailInfoDao dproductStockDetailInfoDao;
	@Override
	public PagingData<DStoreTransInfo> pagingData(DUserInfo dUserInfo, DStoreTransAListDto listDto) {
		List<DStoreTransInfo> list = dStoreTransDao.list(dUserInfo, listDto);
		for(DStoreTransInfo dStoreTransInfo : list){
			if(dStoreTransInfo.getCreateTime() != null && dStoreTransInfo.getCreateTime() != ""){
				dStoreTransInfo.setCreateTime(dStoreTransInfo.getCreateTime().substring(0,10));
			}
			if(dStoreTransInfo.getInTime() != null && dStoreTransInfo.getInTime() != ""){
				dStoreTransInfo.setInTime(dStoreTransInfo.getInTime().substring(0,10));
			}
			if(dStoreTransInfo.getOutTime() != null && dStoreTransInfo.getOutTime() != ""){
				dStoreTransInfo.setOutTime(dStoreTransInfo.getOutTime().substring(0,10));
			}
		}
		int count = dStoreTransDao.count(dUserInfo, listDto);
		PagingData<DStoreTransInfo> pagingData = new PagingData<>(list, count);
		return pagingData;
	}
	@Override
	public DstoreTransDetail dstoreTransDetail(DUserInfo dUserInfo, String id) {
		DstoreTransDetail dstoreTransDetail = dStoreTransDao.findDetail(id,dUserInfo.getdId());
		return dstoreTransDetail;
	}

	@Override
	public String findProWhereMid(String proId) {
		DstoreProductType dstoreProductType = dStoreTransDao.findProWhereMid(proId);
		if(dstoreProductType == null){
			return "商品无效";
		}
		String type = dstoreProductType.getType();
		if(type.equals("M")){
			return dstoreProductType.getId();
		}else{
			return "";
		}
	}

	@Override
	@Transactional
	public int add(DUserInfo dUserInfo, DStoreTransAddDto addDto) {
		String uuid = UUIDUtil.get32UUID();
		int add = dStoreTransDao.add(uuid, dUserInfo, addDto);
		if (add==1) {
			for (DStoreTransAddDetailDto addDetailDto : addDto.getList()) {
				if (addDetailDto.getMid()==null||addDetailDto.getMid().trim().equals("")) {
					addDetailDto.setMid("");
				}
				String price = dproductStockDetailInfoDao.getCostUnitPrice(dUserInfo.getdId(),addDto.getOutStore(),addDetailDto.getMid(),addDetailDto.getMpid());
				dStoreTransDao.addDetail(uuid,price,dUserInfo, addDetailDto);
			}
			return add;
		}
		return 0;
	}
	@Override
	@Transactional
	public int edit(DUserInfo dUserInfo, DStoreTransEditDto editDto) {
		int edit =  dStoreTransDao.edit(dUserInfo, editDto);
		if (edit==1) {
			int delete = dStoreTransDao.deleteDetail(dUserInfo, editDto);
			String uuid = editDto.getId();
			for (DStoreTransAddDetailDto addDetailDto : editDto.getList()) {
				if (addDetailDto.getMid()==null||addDetailDto.getMid().trim().equals("")) {
					addDetailDto.setMid("");
				}
				String price = dproductStockDetailInfoDao.getCostUnitPrice(dUserInfo.getdId(),editDto.getOutStore(),addDetailDto.getMid(),addDetailDto.getMpid());
				dStoreTransDao.addDetail(uuid,price,dUserInfo, addDetailDto);
			}
			return edit;
		}
		return 0;
	}
	@Override
	public int delete(DUserInfo dUserInfo, String id) {
		int delete = dStoreTransDao.delete(dUserInfo, id);
		return delete;
	}
	@Override
	@Transactional
	public int outConfirm(DUserInfo dUserInfo, String id) {
		DstoreTransDetail dstoreTransDetail = dStoreTransDao.findDetail(id,dUserInfo.getdId());
		if(dstoreTransDetail == null){
			return 3;
		}
		for(DStoreTransInfoDetail dStoreTransInfoDetail : dstoreTransDetail.getList()){
			String did = dUserInfo.getdId();
			String outStore = dstoreTransDetail.getOutStore();
			String mpid = dStoreTransInfoDetail.getMpid();
			String allStore = outStore;
			Integer num = dStoreTransDao.findRemainNum(did,allStore,mpid);
			if(num == null){
				num = 0;
			}
			int a  =num - dStoreTransInfoDetail.getDpNum();
			if(a < 0){
				return 4;
			}
			int productOut = dStoreTransDao.productOut(num,did,outStore,id,dStoreTransInfoDetail);
			if (productOut!=1) {
				return 2;
			}
		}
		int result = dStoreTransDao.outConfirm(dUserInfo, id);
		return result;
	}
	@Override
	@Transactional
	public int inConfirm(DUserInfo dUserInfo, String id) {
		DstoreTransDetail dStoreTransDetail = dStoreTransDao.findDetail(id,dUserInfo.getdId());
		for(DStoreTransInfoDetail dStoreTransInfoDetail:dStoreTransDetail.getList()){
			String did = dUserInfo.getdId();
			String inStore = dStoreTransDetail.getInStore();
			String mpid = dStoreTransInfoDetail.getMpid();
			String allStore = inStore;
			Integer num = dStoreTransDao.findRemainNum(dUserInfo.getdId(),allStore,mpid);
			if(num == null){
				num = 0;
			}
			int productIn = dStoreTransDao.productIn(num,did,inStore,id,dStoreTransInfoDetail);
			if (productIn!=1) {
				return 2;
			}
		}
		int result = dStoreTransDao.inConfirm(dUserInfo, id);
		return result;
	}

}
